#include "SymboleValue.h"
#include <stdlib.h>

////////////////////////////////////////////////////////////////////////////////
SymboleValue::SymboleValue(Symbole s) :
        Symbole(s.getChaine()) {
    defini = true;
    if (s == "<ENTIER>") {
	valeur = new ValeurInt(atoi(s.getChaine().c_str())); // c_str convertit une string en char*
    } else if (s == "<REEL>") {
	valeur = new ValeurFloat(atof(s.getChaine().c_str()));
    } else if (s == "<CHAINE>") {
	string ch = "";
	for (unsigned int i = 1; i <= s.getChaine().size() - 2; i++)
	    ch += s.getChaine()[i];
	valeur = new ValeurString(ch);
    } else if (s == "<CHAR>") {
	valeur = new ValeurChar(s.getChaine()[1]);
    } else {
        valeur = 0;
        defini = false;
    }
}

////////////////////////////////////////////////////////////////////////////////
void SymboleValue::afficher(unsigned short indentation) {
        Noeud::afficher(indentation);
        cout << "Feuille - Symbole value : " << getChaine() << endl; // on affiche la chaine du symbole
}

////////////////////////////////////////////////////////////////////////////////
// Attention : cette fonction (operator) n'est pas membre de la classe SymboleValue
ostream & operator <<(ostream & cout, SymboleValue symb) {
    cout << (Symbole) symb << "\t\t - ";
    Valeur* val = symb.valeur;
    if (symb.defini) {
        if ( symb == "<ENTIER>" ) {
            cout << ((ValeurInt*)val)->getValeur() << " ";
        }
        else if ( symb == "<REEL>" ) {
            cout << ((ValeurFloat*)val)->getValeur() << " ";
        }
        else if ( symb == "<CHAINE>" ) {
            cout << ((ValeurString*)val)->getValeur() << " ";
        }
        else if ( symb == "<CHAR>") {
            cout << ((ValeurChar*)val)->getValeur() << " ";
        }
        else if ( symb == "<VARIABLE>") {
            if (typeid(*val)==typeid(ValeurFloat)) cout << ((ValeurFloat*)val)->getValeur() << " ";
            else if (typeid(*val)==typeid(ValeurInt))        cout << ((ValeurInt*)val)->getValeur() << " ";
            else if (typeid(*val)==typeid(ValeurChar))  cout << ((ValeurChar*)val)->getValeur() << " ";
            else if (typeid(*val)==typeid(ValeurString))cout << ((ValeurString*)val)->getValeur() << " "; 
        }
    }
    else
        cout << "indefinie ";
    return cout;
}

